package com.sun.local.filter;

import cn.hutool.core.io.FileUtil;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;

import static com.sun.common.constants.Constant.SSQ_FILE_PATH;

/**
 * 随机生成数据
 */
public class RandomByCondition {

    // 生成数据路径
    public static final String READ_PATH = System.getProperty("user.dir") + File.separator + "data" +
            File.separator + "ac" + File.separator + "ssq_ac_";
    // 随机数据路径
    public static final String WRITE_PATH = System.getProperty("user.dir") + File.separator + "data" +
            File.separator + "random" + File.separator + "ssq_random_";

    public static String FIRST_NUM;
    public static String LAST_NUM;

    static {
        // 最新一期数据
        String latestData = FileUtil.readUtf8Lines(SSQ_FILE_PATH).get(0);
        // 获取逗号减2位到加号之间的数据
        String ssq = latestData.substring(latestData.indexOf(",") - 2, latestData.indexOf("+"));
        // 逗号分隔
        String[] split = ssq.split(",");
        // 第一位
        FIRST_NUM = split[0];
        // 最后一位
        LAST_NUM = split[split.length - 1];
    }

    public static void main(String[] args) {
        random();
    }

    /**
     * 随机生成数据并保存
     */
    public static void random() {
        for (int i = 4; i <= 10; i++) {
            // 读取文件数据
            List<String> acSsqList = FileUtil.readUtf8Lines(READ_PATH + i + ".text");

            // 过滤历史号码
            filterRepeat(acSsqList);

            // 杀号
            filterKillNum(acSsqList);

            // 写出数据
            waiteData(acSsqList, i,"2000", true);
        }
        System.out.println("随机生成完成！");
    }

    /**
     * 过滤历史出现过的号码
     *
     * @param acSsqList 全部红球组合
     */
    private static void filterRepeat(List<String> acSsqList) {
        List<String> lines = acSsqList.stream()
                .filter(line -> !line.contains("#"))
                .collect(Collectors.toList());
        acSsqList.clear();
        acSsqList.addAll(lines);
    }

    /**
     * 排除号码
     *
     * @param acSsqList 全部红球组合
     */
    private static void filterKillNum(List<String> acSsqList) {
        List<String> lines = new ArrayList<>();
        for (String ssq : acSsqList) {
            if(!StringUtils.contains(ssq, FIRST_NUM) && !StringUtils.contains(ssq, LAST_NUM)) {
                lines.add(ssq);
            }
        }
        acSsqList.clear();
        acSsqList.addAll(lines);
    }

    /**
     * 写出数据
     *
     * @param acSsqList 全部红球组合
     * @param ac AC值
     * @param randomNum 随机几注
     * @param isAppendBlueBall 是否追加蓝球
     */
    public static void waiteData(List<String> acSsqList, int ac, String randomNum, boolean isAppendBlueBall) {
        List<String> outputList = new ArrayList<>();
        for (String combination : acSsqList) {
            if(isAppendBlueBall) {
                String blueBall = fillZero(new Random().nextInt(16) + 1);
                combination  = combination + "+" + blueBall;
            }
            outputList.add(combination);
        }

        // 对列表进行随机排序
        Collections.shuffle(outputList);

        if(!StringUtils.equalsIgnoreCase("ALL", randomNum)) {
            // 获取前N个元素
            outputList = outputList.subList(0, Integer.parseInt(randomNum));
        }

        // 写入第一行
        outputList.add(0, getFirstLine(outputList, ac));

        // 清空文件内容
        FileUtil.writeUtf8String("", WRITE_PATH + ac +".text");
        // 写出随机数据
        FileUtil.appendUtf8Lines(outputList, WRITE_PATH + ac +".text");
    }

    /**
     * 小于10的数字，前面加0。
     *
     * @param num 数字
     * @return 数字字符
     */
    private static String fillZero(int num) {
        String numStr = "";
        if(num < 10) {
            numStr = "0" + num;
        } else {
            numStr = String.valueOf(num);
        }
        return numStr;
    }

    /**
     * 获取第一行内容
     * @param outputList 输出内容
     * @return 第一行内容
     */
    private static String getFirstLine(List<String> outputList, int ac) {
        return "AC=" + ac + "|过滤数字：" + FIRST_NUM + "," + LAST_NUM +
                "|组合数量：" + outputList.size() + "|生成时间：" + getNowStr();
    }

    /**
     * 获取当前时间 格式：yyyy-MM-dd HH:mm:ss
     */
    private static String getNowStr() {
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime localDateTime = LocalDateTime.now();
        return localDateTime.format(fmt);
    }

}
